from app.libs.helper import is_isbn_or_key
from app.modes.base import db, Base
from sqlalchemy import Column, Integer, String, Boolean, Float
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import login_manager
from app.modes.gift import Gift
from app.modes.wish import Wish
from app.spider.yushu_book import YuShuBook


class User(Base, UserMixin):
    __tablename__ = 'user'  # 一般是以类名作为表名，这种写法可以改变
    # __bind_key__ = 'fisher'

    id = Column(Integer, primary_key=True)
    nickname = Column(String(24), nullable=False)
    _password = Column('password', String(128), nullable=False)  # 一般属性名就是字段名，这种写法可以改变
    phone_number = Column(String(18), unique=True)
    email = Column(String(50), unique=True, nullable=False)
    confirmed = Column(Boolean, default=False)
    beans = Column(Float, default=0)  # 鱼豆
    send_counter = Column(Integer, default=0)
    receive_counter = Column(Integer, default=0)
    wx_open_id = Column(String(50))
    wx_name = Column(String(32))

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, raw):  # 处理密码，赋值给password（被@property装饰的方法）属性
        self._password = generate_password_hash(raw)

    def check_password(self, raw):
        # 加密原始密码数据 和 数据库已加密的密码比较
        return check_password_hash(self._password, raw)

    # flask-login 插件规定必须要这个方法还要一些其他的方法，所有直接继承父类UserMixin，就不用写了，
    # 有特殊需求可以自己重新方法
    # def get_id(self):
    #     return self.id
    def can_save_to_list(self, isbn):
        if is_isbn_or_key(isbn) != 'isbn':
            return False
        yushu_book = YuShuBook()
        yushu_book.search_by_isbn(isbn)
        if not yushu_book.first:
            return False
        # 不允许一个用户同时赠送多本相同的图书
        # 一个用户不可能同时成为赠送者和索要者

        # 既不在赠送清单，也不在心愿清单才能添加

        gifting = Gift.query.filter_by(uid=self.id, isbn=isbn, launched=False).first()  # gift:礼物
        # 查询字段uid=self.id, isbn=isbn, launched=False，的数据并返回第一条
        wishing = Wish.query.filter_by(uid=self.id, isbn=isbn, launched=False).first()  # wish：心愿
        if not gifting and not wishing:
            return True
        else:
            return False


@login_manager.user_loader
def get_user(uid):
    return User.query.get(int(uid))
